package cn.iocoder.yudao.module.search.tenant;

import cn.hutool.core.util.StrUtil;
import lombok.experimental.UtilityClass;

/**
 * 索引命名策略
 * 实现租户级别的索引物理隔离
 * 
 * @author 芋道源码
 */
@UtilityClass
public class IndexNamingStrategy {

    /**
     * 索引名称分隔符
     */
    private static final String SEPARATOR = "_";

    /**
     * 租户前缀
     */
    private static final String TENANT_PREFIX = "tenant";

    /**
     * 构建带租户前缀的索引名称
     * 格式：tenant_{tenantId}_{originalIndexName}
     * 例如：tenant_001_blog, tenant_002_user
     * 
     * @param tenantId 租户ID
     * @param originalIndexName 原始索引名称
     * @return 带租户前缀的索引名称
     */
    public static String buildTenantIndexName(Long tenantId, String originalIndexName) {
        if (tenantId == null) {
            throw new IllegalArgumentException("租户ID不能为空");
        }
        if (StrUtil.isBlank(originalIndexName)) {
            throw new IllegalArgumentException("索引名称不能为空");
        }
        
        // 格式化租户ID为3位数字，不足补0
        return TENANT_PREFIX + SEPARATOR + tenantId + SEPARATOR + originalIndexName;
    }



    /**
     * 从带租户前缀的索引名称中提取原始索引名称
     * 
     * @param tenantIndexName 带租户前缀的索引名称
     * @return 原始索引名称
     */
    public static String extractOriginalIndexName(String tenantIndexName) {
        if (StrUtil.isBlank(tenantIndexName)) {
            return tenantIndexName;
        }
        
        // 检查是否是租户索引格式
        if (!tenantIndexName.startsWith(TENANT_PREFIX + SEPARATOR)) {
            return tenantIndexName;
        }
        
        // 分割索引名称：tenant_001_blog -> [tenant, 001, blog]
        String[] parts = tenantIndexName.split(SEPARATOR);
        if (parts.length < 3) {
            return tenantIndexName;
        }
        
        // 重新组合原始索引名称（去掉前两部分：tenant_001）
        StringBuilder originalName = new StringBuilder();
        for (int i = 2; i < parts.length; i++) {
            if (i > 2) {
                originalName.append(SEPARATOR);
            }
            originalName.append(parts[i]);
        }
        
        return originalName.toString();
    }

    /**
     * 从带租户前缀的索引名称中提取租户ID
     * 
     * @param tenantIndexName 带租户前缀的索引名称
     * @return 租户ID，如果不是租户索引格式则返回null
     */
    public static Long extractTenantId(String tenantIndexName) {
        if (StrUtil.isBlank(tenantIndexName)) {
            return null;
        }
        
        // 检查是否是租户索引格式
        if (!tenantIndexName.startsWith(TENANT_PREFIX + SEPARATOR)) {
            return null;
        }
        
        // 分割索引名称：tenant_001_blog -> [tenant, 001, blog]
        String[] parts = tenantIndexName.split(SEPARATOR);
        if (parts.length < 3) {
            return null;
        }
        
        try {
            return Long.parseLong(parts[1]);
        } catch (NumberFormatException e) {
            return null;
        }
    }

    /**
     * 检查索引名称是否是租户索引格式
     * 
     * @param indexName 索引名称
     * @return 是否是租户索引格式
     */
    public static boolean isTenantIndex(String indexName) {
        return extractTenantId(indexName) != null;
    }

    /**
     * 构建租户索引通配符模式
     * 用于查询某个租户的所有索引
     * 
     * @param tenantId 租户ID
     * @return 索引通配符模式，例如：tenant_001_*
     */
    public static String buildTenantIndexPattern(Long tenantId) {
        if (tenantId == null) {
            throw new IllegalArgumentException("租户ID不能为空");
        }
        
        return TENANT_PREFIX + SEPARATOR + tenantId + SEPARATOR + "*";
    }



}
